<%@page import="java.sql.*"%>
<%@page errorPage="error.jsp"  %>
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>分页显示成语</title>
<style type="text/css">
.kuang{ width:1200px; margin:auto;}
.nav{ margin-bottom: 10px;}
a { text-decoration: none; color:gray; }
a:hover{ color:red; }
b{ color:red; font-weight: bold;}
.content{
	display: flex;
	border: 3px solid red;
}
.column{
	flex-grow: 1;
	margin:10px;
	border:1px dotted gray;
	padding: 10px;
}
h1{
	text-align: center;
	color: red;
}
p{
	margin:0;
	padding: 5px;
}
</style>
</head>
<body>

<div class='kuang'>
<h1>中国成语大全</h1>
	<div class='nav'>
<%
String url="jdbc:mysql://localhost:3306/db?serverTimezone=PRC";
//(1)加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//(2)创建数据库连接
Connection cn = DriverManager.getConnection(url,"root","12qwas");
//(3)创建预处理语句对象以执行sql指令
PreparedStatement ps = cn.prepareStatement("select count(*) from chengyu");
//(5)执行查询获取记录集
ResultSet rs = ps.executeQuery();
rs.next();
int total=rs.getInt(1);//总的成语个数
int lanNumber=6;//分栏的数量
int chengyuNumberPerLan=21;//每个分栏成语的个数
int pageSize=lanNumber*chengyuNumberPerLan;//每个页面显示成语的个数
int maxPages=total/pageSize+(total%pageSize!=0?1:0);//最大页面数
String currentPage=request.getParameter("page");//获取当前要显示的页面
if(currentPage==null)currentPage="1";//如果没有提供参数默认显示第1页
int cp=Integer.parseInt(currentPage);//参数值都是字符串，需要转换成整数
if(cp<1)cp=1;//最小是第1页
else if(cp>maxPages)cp=maxPages;//不能超出最大页面数
int n=15;//当前显示页面前后显示的数字导航超链接的个数
int begin=cp-n;//数字导航开始值
int over=cp+n;//数字导航结束值
if(begin<1){//数字导航最小值是1
	begin=1;
	over=2*n+1;
}else if(over>maxPages){//数字导航最大值不能超出页面总数
	over=maxPages;
	begin=maxPages-2*n;
}
for(int i=begin;i<=over;++i){//循环显示超链接
	if(i==cp)out.println("\t\t<b>"+i+"</b>");
	else out.println("\t\t<a href='?page="+i+"'>"+i+"</a>");
}
out.println("\t</div>");
out.println("\t<div class='content'>");
ps = cn.prepareStatement("select cy from chengyu limit ?, ?");
ps.setInt(1, (cp-1)*pageSize);//跳过的记录数
ps.setInt(2, pageSize);//获取指定个数的成语
rs = ps.executeQuery();
String cy=null;//存放获取的成语
boolean hasMoreChengyu=true;//是否还有成语的标志
for(int i=0;i<lanNumber;++i){
	out.println("\t\t<div class='column'>");
	for(int j=0;j<chengyuNumberPerLan;++j){//循环显示每一条成语
		if(hasMoreChengyu){
			if(rs.next())cy=rs.getString("cy");
			else {
				cy="　　　　";
				hasMoreChengyu=false;
			}
		}
		out.println("\t\t\t<p>"+cy+"</p>");
	}
	out.println("\t\t</div>");
}
rs.close();
ps.close();
cn.close();
%>
	</div>
</div>
</body>
</html>